<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" dir="ltr" class="client-nojs">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Union declaration - cppreference.com</title>
<meta charset="UTF-8">
<meta name="generator" content="MediaWiki 1.21.2">


<link rel="shortcut icon" href="../../../favicon.ico">



<link rel="stylesheet" href="../../../common/ext.css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" href="../../../common/site_modules.css">
<style>a:lang(ar),a:lang(ckb),a:lang(fa),a:lang(kk-arab),a:lang(mzn),a:lang(ps),a:lang(ur){text-decoration:none}#toc{display:none}.editsection{display:none}
/* cache key: mwiki1-mwiki_en_:resourceloader:filter:minify-css:7:472787eddcf4605d11de8c7ef047234f */</style>

<script src="../../../common/startup_scripts.js"></script>
<script>if(window.mw){
mw.config.set({"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"c/language/union","wgTitle":"c/language/union","wgCurRevisionId":70245,"wgArticleId":13165,"wgIsArticle":true,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Todo with reason"],"wgBreakFrames":false,"wgPageContentLanguage":"en","wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgMonthNamesShort":["","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"wgRelevantPageName":"c/language/union","wgRestrictionEdit":[],"wgRestrictionMove":[]});
}</script><script>if(window.mw){
mw.loader.implement("user.options",function(){mw.user.options.set({"ccmeonemails":0,"cols":80,"date":"default","diffonly":0,"disablemail":0,"disablesuggest":0,"editfont":"default","editondblclick":0,"editsection":0,"editsectiononrightclick":0,"enotifminoredits":0,"enotifrevealaddr":0,"enotifusertalkpages":1,"enotifwatchlistpages":0,"extendwatchlist":0,"externaldiff":0,"externaleditor":0,"fancysig":0,"forceeditsummary":0,"gender":"unknown","hideminor":0,"hidepatrolled":0,"imagesize":2,"justify":0,"math":1,"minordefault":0,"newpageshidepatrolled":0,"nocache":0,"noconvertlink":0,"norollbackdiff":0,"numberheadings":0,"previewonfirst":0,"previewontop":1,"quickbar":5,"rcdays":7,"rclimit":50,"rememberpassword":0,"rows":25,"searchlimit":20,"showhiddencats":0,"showjumplinks":1,"shownumberswatching":1,"showtoc":0,"showtoolbar":1,"skin":"cppreference2","stubthreshold":0,"thumbsize":2,"underline":2,"uselivepreview":0,"usenewrc":0,"watchcreations":0,"watchdefault":0,"watchdeletion":0,
"watchlistdays":3,"watchlisthideanons":0,"watchlisthidebots":0,"watchlisthideliu":0,"watchlisthideminor":0,"watchlisthideown":0,"watchlisthidepatrolled":0,"watchmoves":0,"wllimit":250,"variant":"en","language":"en","searchNs0":true,"searchNs1":false,"searchNs2":false,"searchNs3":false,"searchNs4":false,"searchNs5":false,"searchNs6":false,"searchNs7":false,"searchNs8":false,"searchNs9":false,"searchNs10":false,"searchNs11":false,"searchNs12":false,"searchNs13":false,"searchNs14":false,"searchNs15":false,"gadget-ColiruCompiler":1});;},{},{});mw.loader.implement("user.tokens",function(){mw.user.tokens.set({"editToken":"+\\","patrolToken":false,"watchToken":false});;},{},{});
/* cache key: mwiki1-mwiki_en_:resourceloader:filter:minify-js:7:ca03345b1e2c4d90a25d968753a73b92 */
}</script>
<script>if(window.mw){
mw.loader.load(["mediawiki.page.startup","mediawiki.legacy.wikibits","mediawiki.legacy.ajax"]);
}</script>
<style type="text/css">/*<![CDATA[*/
.source-c {line-height: normal;}
.source-c li, .source-c pre {
	line-height: normal; border: 0px none white;
}
/**
 * GeSHi Dynamically Generated Stylesheet
 * --------------------------------------
 * Dynamically generated stylesheet for c
 * CSS class: source-c, CSS id: 
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 * --------------------------------------
 */
.c.source-c .de1, .c.source-c .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
.c.source-c  {font-family:monospace;}
.c.source-c .imp {font-weight: bold; color: red;}
.c.source-c li, .c.source-c .li1 {font-weight: normal; vertical-align:top;}
.c.source-c .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
.c.source-c .li2 {font-weight: bold; vertical-align:top;}
.c.source-c .kw1 {color: #0000dd;}
.c.source-c .kw2 {color: #0000ff;}
.c.source-c .kw3 {color: #0000dd;}
.c.source-c .kw4 {color: #0000ff;}
.c.source-c .co1 {color: #909090;}
.c.source-c .co2 {color: #339900;}
.c.source-c .coMULTI {color: #ff0000; font-style: italic;}
.c.source-c .es0 {color: #008000; font-weight: bold;}
.c.source-c .es1 {color: #008000; font-weight: bold;}
.c.source-c .es2 {color: #008000; font-weight: bold;}
.c.source-c .es3 {color: #008000; font-weight: bold;}
.c.source-c .es4 {color: #008000; font-weight: bold;}
.c.source-c .es5 {color: #008000; font-weight: bold;}
.c.source-c .br0 {color: #008000;}
.c.source-c .sy0 {color: #008000;}
.c.source-c .sy1 {color: #000080;}
.c.source-c .sy2 {color: #000040;}
.c.source-c .sy3 {color: #000040;}
.c.source-c .sy4 {color: #008080;}
.c.source-c .st0 {color: #008000;}
.c.source-c .nu0 {color: #000080;}
.c.source-c .nu6 {color:#000080;}
.c.source-c .nu8 {color:#000080;}
.c.source-c .nu12 {color:#000080;}
.c.source-c .nu16 {color:#000080;}
.c.source-c .nu17 {color:#000080;}
.c.source-c .nu18 {color:#000080;}
.c.source-c .nu19 {color:#000080;}
.c.source-c .ln-xtra, .c.source-c li.ln-xtra, .c.source-c div.ln-xtra {background-color: #ffc;}
.c.source-c span.xtra { display:block; }

/*]]>*/
</style>
<style type="text/css">/*<![CDATA[*/
.source-text {line-height: normal;}
.source-text li, .source-text pre {
	line-height: normal; border: 0px none white;
}
/**
 * GeSHi Dynamically Generated Stylesheet
 * --------------------------------------
 * Dynamically generated stylesheet for text
 * CSS class: source-text, CSS id: 
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 * --------------------------------------
 */
.text.source-text .de1, .text.source-text .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
.text.source-text  {font-family:monospace;}
.text.source-text .imp {font-weight: bold; color: red;}
.text.source-text li, .text.source-text .li1 {font-weight: normal; vertical-align:top;}
.text.source-text .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
.text.source-text .li2 {font-weight: bold; vertical-align:top;}
.text.source-text .ln-xtra, .text.source-text li.ln-xtra, .text.source-text div.ln-xtra {background-color: #ffc;}
.text.source-text span.xtra { display:block; }

/*]]>*/
</style>
<!--[if lt IE 7]><style type="text/css">body{behavior:url("/mwiki/skins/cppreference2/csshover.min.htc")}</style><![endif]-->
</head>
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-c_language_union skin-cppreference2 action-view cpp-navbar">
        <!-- header -->
        
        <!-- /header -->
        <!-- content -->
        <div id="cpp-content-base">
            <div id="content">
                <a id="top"></a>
                <div id="mw-js-message" style="display:none;"></div>
                                <!-- firstHeading -->
                <h1 id="firstHeading" class="firstHeading">Union declaration</h1>
                <!-- /firstHeading -->
                <!-- bodyContent -->
                <div id="bodyContent">
                                        <!-- tagline -->
                    <div id="siteSub">From cppreference.com</div>
                    <!-- /tagline -->
                                        <!-- subtitle -->
                    <div id="contentSub"><span class="subpages">&lt; <a href="../../c.html" title="c">c</a>‎ | <a href="../language.1.html" title="c/language">language</a></span></div>
                    <!-- /subtitle -->
                                                            <!-- bodycontent -->
                    <div id="mw-content-text" lang="en" dir="ltr" class="mw-content-ltr">
<div class="t-navbar" style="">
<div class="t-navbar-sep"> </div>
<div class="t-navbar-head">
<a href="../../c.html" title="c"> C</a><div class="t-navbar-menu"><div>
<div><table class="t-nv-begin" cellpadding="0" style="line-height:1.1em;">
<tr class="t-nv"><td colspan="5"> <a href="../language.1.html" title="c/language"> Language</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../header.html" title="c/header"> Standard Library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../types.html" title="c/types"> Type support</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../memory.html" title="c/memory"> Dynamic memory management</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../error.html" title="c/error"> Error handling</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../program.html" title="c/program"> Program utilities</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../chrono.html" title="c/chrono"> Date and time utilities</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../string.html" title="c/string"> Strings library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../algorithm.html" title="c/algorithm"> Algorithms</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../numeric.html" title="c/numeric"> Numerics</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../io.html" title="c/io"> Input/output support</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../locale.html" title="c/locale"> Localization support</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../thread.html" title="c/thread"> Thread support</a> <span class="t-mark-rev t-since-c11">(C11)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../atomic.html" title="c/atomic"> Atomic operations</a> <span class="t-mark-rev t-since-c11">(C11)</span> </td></tr>
</table></div>
<div></div>
</div></div>
</div>
<div class="t-navbar-sep"> </div>
<div class="t-navbar-head">
<a href="../language.1.html" title="c/language"> C language</a><div class="t-navbar-menu"><div>
<div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv-h1"><td colspan="5"> General topics</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../preprocessor.html" title="c/preprocessor"> Preprocessor</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/comments (page does not exist)"> Comments</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../keyword.html" title="c/keyword"> Keywords</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/language/escape (page does not exist)"> Escape sequences</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="history.html" title="c/language/history"> History of C</a>
</td></tr>
<tr class="t-nv-h1"><td colspan="5"> Flow control</td></tr>
<tr class="t-nv-h2"><td colspan="5"> Conditional execution statements</td></tr>
<tr class="t-nv-col-table">
<td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="if.html" title="c/language/if"> <code>if</code> statement</a>
</td></tr>
</table></div></td>
<td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="switch.html" title="c/language/switch"> <code>switch</code> statement</a>
</td></tr>
</table></div></td>
</tr>
<tr class="t-nv-h2"><td colspan="5"> Iteration statements</td></tr>
<tr class="t-nv-col-table">
<td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="for.html" title="c/language/for"> <code>for</code> loop</a>
</td></tr>
</table></div></td>
<td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="while.html" title="c/language/while"> <code>while</code> loop</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="do.html" title="c/language/do"> <code>do-while</code> loop</a>
</td></tr>
</table></div></td>
</tr>
<tr class="t-nv-h2"><td colspan="5"> Jump statements </td></tr>
<tr class="t-nv-col-table">
<td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="continue.html" title="c/language/continue"> <code>continue</code> statement</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="break.html" title="c/language/break"> <code>break</code> statement</a>
</td></tr>
</table></div></td>
<td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="goto.html" title="c/language/goto"> <code>goto</code> statement</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="return.html" title="c/language/return"> <code>return</code> statement</a>
</td></tr>
</table></div></td>
</tr>
<tr class="t-nv-h1"><td colspan="5"> Functions</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/language/function (page does not exist)"> function declaration</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/language/inline (page does not exist)"> inline specifier</a>
</td></tr>
<tr class="t-nv-h1"><td colspan="5"> Types</td></tr>
<tr class="t-nv-col-table">
<td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="types.html" title="c/language/types"> fundamental types</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/language/pointer (page does not exist)"> pointer types</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="struct.html" title="c/language/struct"> compound types</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/language/enum (page does not exist)"> enumeration types</a>
</td></tr>
</table></div></td>
<td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <strong class="selflink"> union types</strong>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/language/function (page does not exist)"> function types</a>
</td></tr>
</table></div></td>
</tr>
<tr class="t-nv-h2"><td colspan="5"> Specifiers</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="cv.html" title="c/language/cv"> cv specifiers</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="storage_class_specifiers.html" title="c/language/storage class specifiers"> storage-class specifiers</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/language/alignas (page does not exist)"> alignas specifier</a> <span class="t-mark-rev t-since-c99">(C99)</span>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="function_specifiers.html" title="c/language/function specifiers"> function specifiers</a> <span class="t-mark-rev t-since-c99">(C99)</span>
</td></tr>
<tr class="t-nv-h2"><td colspan="5"> Literals</td></tr>
<tr class="t-nv-col-table">
<td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/language/integer literal (page does not exist)"> integer literals</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/language/character literal (page does not exist)"> character literals</a>
</td></tr> 
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/language/floating literal (page does not exist)"> floating-point literals</a>
</td></tr>  
</table></div></td>
<td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/language/string literal (page does not exist)"> string literals</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/language/bool literal (page does not exist)"> boolean literals</a><span class="t-mark-rev t-since-c99">(C99)</span>
</td></tr>
</table></div></td>
</tr>
<tr class="t-nv-h1"><td colspan="5"> Expressions</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="eval_order.html" title="c/language/eval order"> order of evaluation</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operators.html" title="c/language/operators"> operators</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operator_precedence.html" title="c/language/operator precedence"> operator precedence</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operator_alternative.html" title="c/language/operator alternative"> alternative operators</a>
</td></tr>
<tr class="t-nv-h1"><td colspan="5"> Utilities</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="typedef.html" title="c/language/typedef"> <code>typedef</code> declaration</a>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/language/attributes (page does not exist)"> attributes</a> <span class="t-mark-rev t-since-c99">(C99)</span>
</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/language/implicit cast (page does not exist)"> casts</a>
</td></tr>
<tr class="t-nv-h1"><td colspan="5"> Miscellaneous </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="http%3A//en.cppreference.com/mwiki/index.php" class="new" title="c/language/asm (page does not exist)"> Inline assembly</a>
</td></tr>
</table></div>
<div></div>
</div></div>
</div>
<div class="t-navbar-sep"> </div>
</div>
<p>A union is a type consisting of a sequence of members whose storage overlaps (as opposed to struct, which is a type consisting of a sequence of members whose storage is allocated in an ordered sequence). The value of at most one of the members can be stored in a union at any one time.
</p>
<p>The type specifier for a union is identical to the <a href="struct.html" title="c/language/struct"> <code>struct</code></a> type specifier except for the keyword used:
</p>
<h3>
<span class="editsection">[<a href="http%3A//en.cppreference.com/mwiki/index.php" title="Edit section: Syntax">edit</a>]</span> <span class="mw-headline" id="Syntax">Syntax</span>
</h3>
<table class="t-sdsc-begin">

<tr>
<td colspan="10" class="t-sdsc-sep">
</td>
</tr>
<tr class="t-sdsc">
<td> <code><b>union</b></code> <span class="t-spar">name</span><span class="t-mark">(optional)</span> <code><b>{ </b></code> <span class="t-spar">struct-declaration-list</span> <code><b>} </b></code>
</td>
<td> (1)
</td>
<td class="t-sdsc-nopad">
</td>
</tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td>
</tr>
<tr class="t-sdsc">
<td> <code><b>union</b></code> <span class="t-spar">name</span>
</td>
<td> (2)
</td>
<td class="t-sdsc-nopad">
</td>
</tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td>
</tr>
</table>
<table class="t-par-begin">


<tr class="t-par">
<td>  <span class="t-spar">name</span>
</td>
<td> -
</td>
<td>  the name of the union that's being defined
</td>
</tr>
<tr class="t-par">
<td>  <span class="t-spar">struct-declaration-list</span>
</td>
<td> -
</td>
<td>  any number of variable declarations, bit field declarations, and static assert declarations. Members of incomplete type and members of function type are not allowed.
</td>
</tr>
</table>
<h3>
<span class="editsection">[<a href="http%3A//en.cppreference.com/mwiki/index.php" title="Edit section: Explanation">edit</a>]</span> <span class="mw-headline" id="Explanation">Explanation</span>
</h3>
<p>The union is only as big as necessary to hold its largest member (additional unnamed trailing padding may also be added). The other members are allocated in the same bytes as part of that largest member. 
</p>
<p>A pointer to a union can be cast to a pointer to each of its members (if a union has bit field members, the pointer to a union can be cast to the pointer to the bit field's underlying type). Likewise, a pointer to any member of a union can be cast to a pointer to the enclosing union. 
</p>
<p>The value of the bytes that correspond to union members other than the one last stored into is unspecified.
</p>
 <table class="t-rev-begin">
<tr class="t-rev t-since-c11">
<td>
<p>Similar to struct, an unnamed member of a union whose type is a union without <span class="t-spar">name</span> is known as <i>anonymous union</i>. Every member of an anonymous union is considered to be a member of the enclosing struct or union. This applies recursively if the enclosing struct or union is also anonymous.
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="c source-c"><pre class="de1"><span class="kw1">struct</span> v <span class="br0">{</span>
   <span class="kw1">union</span> <span class="br0">{</span> <span class="co1">// anonymous union</span>
      <span class="kw1">struct</span> <span class="br0">{</span> <span class="kw4">int</span> i, j<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// anonymous structure</span>
      <span class="kw1">struct</span> <span class="br0">{</span> <span class="kw4">long</span> k, l<span class="sy4">;</span> <span class="br0">}</span> w<span class="sy4">;</span>
   <span class="br0">}</span><span class="sy4">;</span>
   <span class="kw4">int</span> m<span class="sy4">;</span>
<span class="br0">}</span> v1<span class="sy4">;</span>
 
v1.<span class="me1">i</span> <span class="sy1">=</span> <span class="nu0">2</span><span class="sy4">;</span>   <span class="co1">// valid</span>
v1.<span class="me1">k</span> <span class="sy1">=</span> <span class="nu0">3</span><span class="sy4">;</span>   <span class="co1">// invalid: inner structure is not anonymous</span>
v1.<span class="me1">w</span>.<span class="me1">k</span> <span class="sy1">=</span> <span class="nu0">5</span><span class="sy4">;</span> <span class="co1">// valid</span></pre></div></div>
<p>Similar to struct, the behavior of the program is undefined if union is defined without any named members (including those obtained via anonymous nested structs or unions).
</p>
</td>
<td><span class="t-mark-rev t-since-c11">(since C11)</span></td>
</tr>
<table class="metadata plainlinks ambox mbox-small-left ambox-notice" style=""><tr>
<td class="mbox-empty-cell"></td>
<td class="mbox-text" style="">This section is incomplete<br>Reason: initialization or link to a page that will talk about initialization </td>
</tr></table>
<h3>
<span class="editsection">[<a href="http%3A//en.cppreference.com/mwiki/index.php" title="Edit section: Example">edit</a>]</span> <span class="mw-headline" id="Example">Example</span>
</h3>
<table class="metadata plainlinks ambox mbox-small-left ambox-notice" style=""><tr>
<td class="mbox-empty-cell"></td>
<td class="mbox-text" style="">This section is incomplete<br>Reason: simplify </td>
</tr></table>
<div class="t-example">
<p> This example exhibits the active member of a union, casting between union and member pointers, and unnamed trailing padding.
 </p>
<div class="t-example-live-link"><div class="coliru-btn coliru-btn-run-init">Run this code</div></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="c source-c"><pre class="de1"><span class="co2">#include &lt;stdio.h&gt;</span>
<span class="co2">#include &lt;stdint.h&gt;</span>
<span class="co2">#include &lt;stddef.h&gt;</span>
 
<span class="kw1">union</span> S <span class="br0">{</span>
    <a href="../types/integer.html"><span class="kw108">int32_t</span></a> n<span class="sy4">;</span>       <span class="coMULTI">/* occupies 4 bytes */</span>
    <a href="../types/integer.html"><span class="kw121">uint16_t</span></a> s<span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span><span class="sy4">;</span>   <span class="coMULTI">/* occupies 4 bytes */</span>
    <a href="../types/integer.html"><span class="kw120">uint8_t</span></a> c<span class="sy4">;</span>       <span class="coMULTI">/* occupies 1 byte  */</span>
<span class="br0">}</span><span class="sy4">;</span> <span class="coMULTI">/* the whole union occupies 4 bytes */</span>
 
<span class="coMULTI">/* padded union */</span>
<span class="kw1">union</span> pad <span class="br0">{</span>          <span class="coMULTI">/* occupies 8 bytes */</span>
       <span class="kw4">char</span>  c<span class="br0">[</span><span class="nu0">5</span><span class="br0">]</span><span class="sy4">;</span>   <span class="coMULTI">/* occupies 5 bytes */</span>
       <span class="kw4">float</span> f<span class="sy4">;</span>      <span class="coMULTI">/* occupies 4 bytes */</span>
<span class="br0">}</span> p<span class="sy4">;</span>
 
<span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>
<span class="br0">{</span>
    <span class="coMULTI">/* Initialize the first member of s; s.n is now the active member. */</span>
    <span class="kw1">union</span> S s <span class="sy1">=</span> <span class="br0">{</span><span class="nu12">0x12345678</span><span class="br0">}</span><span class="sy4">;</span>
    <a href="../io/fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"sizeof(union S) = %zu<span class="es1">\n</span>"</span>, <span class="kw4">sizeof</span><span class="br0">(</span><span class="kw1">union</span> S<span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
 
    <span class="coMULTI">/* At this point, reading from s.s or s.c is UB. */</span>
    <a href="../io/fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"s.n = %x<span class="es1">\n</span>"</span>, s.<span class="me1">n</span><span class="br0">)</span><span class="sy4">;</span>
 
    <span class="coMULTI">/* Assign a value to s.s[0]. */</span>
    s.<span class="me1">s</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy1">=</span> <span class="nu12">0x0011</span><span class="sy4">;</span>   <span class="co1">// s.s is now the active member</span>
 
    <span class="coMULTI">/* At this point, reading from n or c is UB, but most compilers define this. */</span>
    <a href="../io/fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"s.c is now %x<span class="es1">\n</span>"</span>, s.<span class="me1">c</span><span class="br0">)</span><span class="sy4">;</span>  <span class="co1">// 11 or 00, depending on platform</span>
    <a href="../io/fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"s.n is now %x<span class="es1">\n</span>"</span>, s.<span class="me1">n</span><span class="br0">)</span><span class="sy4">;</span>  <span class="co1">// 12340011 or 00115678</span>
 
    <span class="coMULTI">/* Define a pointer to a union.              */</span>
    <span class="coMULTI">/* Initialize the uint8_t member.            */</span>
    <span class="coMULTI">/* Print the uint8_t member via the pointer. */</span>
    <span class="kw1">union</span> S <span class="sy2">*</span>ps<span class="sy1">=</span><span class="sy3">&amp;</span>s<span class="sy4">;</span>
    s.<span class="me1">c</span> <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
    <a href="../io/fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"%x  %x<span class="es1">\n</span>"</span>,ps<span class="sy2">-</span><span class="sy1">&gt;</span>c,<span class="br0">(</span><span class="sy2">*</span>ps<span class="br0">)</span>.<span class="me1">c</span><span class="br0">)</span><span class="sy4">;</span>
 
    <span class="coMULTI">/* A pointer to a union can be cast to a pointer to each of its members. */</span>
    <a href="../types/integer.html"><span class="kw120">uint8_t</span></a> <span class="sy2">*</span>p8 <span class="sy1">=</span> <span class="sy3">&amp;</span>s.<span class="me1">c</span><span class="sy4">;</span>   <span class="coMULTI">/* pointer to the uint8_t member */</span>
    p8 <span class="sy1">=</span> <span class="br0">(</span><a href="../types/integer.html"><span class="kw120">uint8_t</span></a><span class="sy2">*</span><span class="br0">)</span>ps<span class="sy4">;</span>    <span class="coMULTI">/* cast union pointer to member pointer */</span>
 
    <span class="coMULTI">/* A pointer to any member of a union can be cast to a pointer to the enclosing */</span>
    <span class="coMULTI">/* union.                                                                       */</span>
    ps <span class="sy1">=</span> <span class="br0">(</span><span class="kw1">union</span> S<span class="sy2">*</span><span class="br0">)</span>p8<span class="sy4">;</span>    <span class="coMULTI">/* cast member pointer to union pointer */</span>
 
    <span class="coMULTI">/* Union members are allocated memory at the same starting address. */</span>
    <a href="../io/fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"offset of char c[] = %zu<span class="es1">\n</span>offset of float f  = %zu<span class="es1">\n</span>"</span>,
           <a href="../../cpp/types/offsetof.html"><span class="kw105">offsetof</span></a><span class="br0">(</span><span class="kw1">union</span> pad, c<span class="br0">)</span>, <a href="../../cpp/types/offsetof.html"><span class="kw105">offsetof</span></a><span class="br0">(</span><span class="kw1">union</span> pad, f<span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
 
    <span class="coMULTI">/* Union pad has 3 bytes of unnamed trailing padding. */</span>
    <a href="../io/fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"sizeof(union pad) = %lu<span class="es1">\n</span>"</span>, <span class="kw4">sizeof</span><span class="br0">(</span><span class="kw1">union</span> pad<span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>   <span class="coMULTI">/* 8 bytes */</span>
    <a href="../io/fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"sizeof(p.c)       = %lu<span class="es1">\n</span>"</span>, <span class="kw4">sizeof</span><span class="br0">(</span>p.<span class="me1">c</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>         <span class="coMULTI">/* 5 bytes */</span>
    <a href="../io/fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"sizeof(p.f)       = %lu<span class="es1">\n</span>"</span>, <span class="kw4">sizeof</span><span class="br0">(</span>p.<span class="me1">f</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>         <span class="coMULTI">/* 4 bytes */</span>
 
    <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div></div>
<p>Possible output:
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="text source-text"><pre class="de1">sizeof(union S) = 4
s.n = 12345678
s.c is now 11
s.n is now 12340011
0  0
offset of char c[] = 0
offset of float f  = 0
sizeof(union pad) = 8
sizeof(p.c)       = 5
sizeof(p.f)       = 4</pre></div></div> 
</div>
Each member is allocated as if it were the only member of the union, which is why <code>s.c</code> in the example above aliases the first byte of <code>s.s[0]</code>.</table>

<!-- 
NewPP limit report
Preprocessor visited node count: 1440/1000000
Preprocessor generated node count: 6474/1000000
Post‐expand include size: 51498/2097152 bytes
Template argument size: 12905/2097152 bytes
Highest expansion depth: 17/40
Expensive parser function count: 0/100
-->

<!-- Saved in parser cache with key mwiki1-mwiki_en_:pcache:idhash:13165-0!*!0!!*!*!* and timestamp 20140512175835 -->
</div>                    <!-- /bodycontent -->
                                        <!-- printfooter -->
                    <div class="printfooter">
                    Retrieved from "<a href="http%3A//en.cppreference.com/mwiki/index.php">http://en.cppreference.com/mwiki/index.php?title=c/language/union&amp;oldid=70245</a>"                    </div>
                    <!-- /printfooter -->
                                                            <!-- catlinks -->
                    <div id="catlinks" class="catlinks"><div id="mw-normal-catlinks" class="mw-normal-catlinks">
<a href="http%3A//en.cppreference.com/w/Special%3ACategories" title="Special:Categories">Category</a>: <ul><li><a href="http%3A//en.cppreference.com/w/Category%3ATodo_with_reason" title="Category:Todo with reason">Todo with reason</a></li></ul>
</div></div>                    <!-- /catlinks -->
                                                            <div class="visualClear"></div>
                    <!-- debughtml -->
                                        <!-- /debughtml -->
                </div>
                <!-- /bodyContent -->
            </div>
        </div>
        <!-- /content -->
        <!-- footer -->
        
        <!-- /footer -->
        <script>if(window.mw){
mw.loader.state({"site":"loading","user":"missing","user.groups":"ready"});
}</script>
<script src="../../../common/skin_scripts.js"></script>
<script>if(window.mw){
mw.loader.load(["mediawiki.action.view.postEdit","mediawiki.user","mediawiki.page.ready","mediawiki.searchSuggest","mediawiki.hidpi","ext.gadget.ColiruCompiler"], null, true);
}</script>
<script src="../../../common/site_scripts.js"></script>

<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-2828341-1']);
_gaq.push(['_setDomainName', 'cppreference.com']);
_gaq.push(['_trackPageview']);
</script><!-- Served in 0.090 secs. -->
	</body>
<!-- Cached 20140512210631 -->
</html>
